import {v5 , v4 as uuid} from "uuid";

/**
 * 一条 用户 记录
 *
 */
export class User{
  constructor(config) {
    if (!(config.phone && config.passWord)){
      throw Error(errorMessage(config,'phone','手机号','passWord','密码'));
    }
    this.id = v5(config.phone,v5.DNS);
    this.phone = config.phone;
    this.userName = config.userName || "还没有名字";
    this.email = config.email || null;
    this.userType = config.userType || 0; // 0 是学生、1 是老师、2 是校内工作人员、3 是管理
    this.passWord = config.passWord;
    this.date = config.date || new Date().getTime();
  }
}

// export class UserType{
//   constructor(config) {
//     this.id = v5(config.typeName,v5.DNS);
//     this.typeName = config.typeName;
//     // 到时候对每种类型的用户权限，配合权限表来定义把
//   }
// }

/**
 * 一条 消息 记录
 * 它会 关联 所属 类型，参考 messageType
 * 它会 关联 所属 用户，参考 User
 */
export class Message{
  constructor(config) {
    if (!(config.title && config.content && config.userId && config.messageTypeId)){
      throw Error(errorMessage(config,'title','标题','content','内容','userId','发出者','messageTypeId','消息所属类型'));
    }
    this.id = config.id || uuid();
    this.title = config.title;
    this.content = config.content;
    this.userId = config.userId; // 关联
    this.date = config.date || new Date().getTime();
    this.flag = config.flag || 0; // 0 是待审核 1 是通过 -1 是未通过
    this.messageTypeId = config.messageTypeId; // 关联
  }
}

export class MessageType{
  constructor(config) {
    if (!(config.typeName)){
      throw Error(errorMessage(config,'typeName','消息类型'));
    }

    this.id = config.id || uuid();
    this.typeName = config.typeName;
    this.date = config.date || new Date().getTime();
  }
}

/**
 * 一条 机构 记录
 * 它会 关联 所属机构的所有用户id数组，到时候以这个数组发出并发请求，获取所属用户
 */
export class Office{
  constructor(config) {
    if (!(config.name && config.userId)){
      throw Error(errorMessage(config,'name','机构名称','userId','机构申请者'));
    }

    this.id = config.id || uuid();
    this.name = config.name;
    this.emails = config.emails || [];
    this.phones = config.phones || [];
    this.userId = config.userId;
    this.users = config.users || [config.userId]; // 关联该 机构 下的所有用户 users 数组 id
    this.flag = config.flag || 0;
    this.date = config.date || new Date().getTime();
  }
}

export class Supplies {
  constructor(config) {
    if (!(config.name && config.userId)){
      throw Error(errorMessage(config,'name','物资名称'));
    }

    this.id = config.id || uuid();
    this.name = config.name;
    this.total = +config.total || 0; // 总数
    this.borrowTotal = 0;  // 借出总数
    this.date = config.date || new Date().getTime();
  }
}

export class SuppliesOrder {
  constructor(config) {
    if (!(config.suppliesId && config.lendId && config.typeFlag && config.quantity)){
      throw Error(errorMessage(config,'suppliesId','物资ID','lendId','借出ID','typeFlag','借出者性质','quantity','数量'));
    }

    this.id = config.id || uuid();
    this.suppliesId = config.suppliesId; // 物资 id
    this.lendId = config.lendId; // 借出 id
    this.typeFlag = config.typeFlag; // 0是个人、1是机构
    this.quantity = +config.quantity;
    this.date = config.date || new Date().getTime();
  }
}

function errorMessage(config,...rest) {
  const message = [];
  let index = 0;
  for ( ; index < rest.length ; index += 2){
    if (!config[rest[index]]){
      message.push(`缺少 ${rest[index+1]} 必需参数(${rest[index]})`);
    }
  }
  return message.join(' , ')
}
